#include "utility.h"

void extractFloats(string str, vector<float>& floats) {
    int i = 0;
    while (i < str.length()) {
        // 找到下一个浮点数的起始位置
        while (i < str.length() && !isdigit(str[i]) && str[i] != '-') {
            i++;
        }

        // 如果已经到达字符串末尾，则退出循环
        if (i == str.length()) {
            break;
        }

        // 记录浮点数的起始位置
        int j = i;

        // 找到浮点数的结束位置
        while (j < str.length() && (isdigit(str[j]) || str[j] == '.')) {
            j++;
        }

        // 提取浮点数并保存到数组中
        float f = stof(str.substr(i, j - i));
        floats.push_back(f);

        // 更新下一个浮点数的起始位置
        i = j;
    }
}

char* transer(char *buf,char *buf_token_){

    //模拟令牌
    cJSON* cjson_token = NULL;
    cjson_token= cJSON_CreateObject();
    cJSON_AddNumberToObject(cjson_token, "coke", 2);
    cJSON_AddStringToObject(cjson_token, "name", "name");
    cJSON_AddStringToObject(cjson_token, "password", "password");
    cJSON_AddStringToObject(cjson_token,"token",buf_token_);
    char* token = cJSON_Print(cjson_token);
    //开始处理
    //第一步,提取气象站发来的数据
    vector<float> floats;
    extractFloats(buf, floats);
    cout<<"查看提取的数字"<<endl;\
    for(int cnt=0;cnt<floats.size();cnt++){
        cout<<floats[cnt]<<endl;
    }

    //第二步，封装
    cJSON* cjson_new = NULL;
    cjson_new=cJSON_CreateObject();
    cJSON_AddNumberToObject(cjson_new, "code", 5);
    cJSON_AddItemToObject(cjson_new, "token", cjson_token);
//    std::cout<<"token:"<<token<<std::endl;
    cJSON_AddNumberToObject(cjson_new, "station", 1);
    int time_;
    time_t t;
    time_ = time(&t);
    cJSON_AddNumberToObject(cjson_new, "time", time_);
    std::ostringstream oss;
    oss<<std::fixed << std::setprecision(2)<<floats[3];
    double temperature=std::stod(oss.str());
    cJSON_AddNumberToObject(cjson_new, "temperature",temperature);
    std::ostringstream oss1;
    oss1<<std::fixed << std::setprecision(2)<<floats[4];
    double humidity=std::stod(oss1.str());
    cJSON_AddNumberToObject(cjson_new, "humidity", humidity);

    cJSON_AddNumberToObject(cjson_new, "speed", floats[0]);
    cJSON_AddNumberToObject(cjson_new, "direction", floats[2]);
    cJSON_AddNumberToObject(cjson_new, "rain", floats[6]);
    cJSON_AddNumberToObject(cjson_new, "sunlight", floats[11]);
    cJSON_AddNumberToObject(cjson_new, "pm25", floats[8]);
    cJSON_AddNumberToObject(cjson_new, "pm10", floats[9]);

//    char *buf = NULL;
//    std::cout<<"直接用cjson_Print()输出"<<std::endl;
//    std::cout<<cJSON_Print(cjson_new)<<std::endl;
    char *data=NULL;
    data=cJSON_Print(cjson_new);
    std::cout << "处理后的数据(transer函数里面的输出)" << std::endl;
    std::cout << data<< std::endl;
    cJSON_Delete(cjson_new);
    //记得加上数据信息的判断
    //send_data(data);
    return data;
}

int* discern(int * nums,char *s){
    int num=0;
    while(*s != '\0')
    {
        if(isdigit(*s)){
            char str[100] = {0};int i=0;//存储下一个数字前必须从新初始化
            while(isdigit(*s)){
                str[i] = *s;
                i++;
                s++;}
            str[i + 1] = '\0';//要加此标识符方便函数判断结束

            nums[num] = atoi(str);//将连续数字字符转换为数字
            num++;
        }
        s++;
    }
    return nums;
}

std::string Convert(float Num){
    std::ostringstream oss;
    oss<<Num;
    std::string str(oss.str());
    return str;
}

string randomNumString(int length) {
    // 数字字符集
    const char numSet[] = "0123456789";
    int numSetSize = sizeof(numSet) - 1;

    // 初始化随机数生成器
    srand(time(nullptr));

    // 生成随机数字字符串
    string numString;
    for (int i = 0; i < length; i++) {
        numString += numSet[rand() % numSetSize];
    }

    return numString;
}

void StrExtFloat(float *num,char* Str){
    //遍历深度
    int Fflag = 0;
    //数字个数
    int Fnum = 0;
    char num_start = 0,num_point = 0;
    //遍历到字符串尾部
    while ( *Str != '\0' )
    {
        Fflag++;
        //防止查询超过边界
        if(Fflag>1024)
            break;
        //判断是不是数字
        if(*Str >='0' && *Str <= '9')
        {
            //printf("%c",*Str);
            //判断数字存在
            num_start = 1;
            //判断是否存在小数点
            if(num_point >= 1)
            {
                num_point++;
                //当前小数部分的数值
                float fpoint = *Str - '0';
                for(int i = 1;i<num_point;i++)
                {
                    fpoint = fpoint/10.;
                }
                //加入小数部分
                num[Fnum+1] = num[Fnum+1] + fpoint;
            }
            else
            {
                //加入整数部分
                num[Fnum+1] = num[Fnum+1]*10+(*Str - '0');
            }
        }
        else if(*Str == '.') //判断为小数点
        {
            if(num_start==1)//发现存在小数点
            {
                num_point=1;
            }
        }
        else //判断为其他字符
        {
            if (num_start == 1)
            {
                Fnum++;//统计个数加一
            }
            //清空字符统计与小数点统计
            num_start = 0;
            num_point = 0;
        }
        //指针移动
        *(Str++);
    }
    //如果不是以字符结尾
    if (num_start == 1)
    {
        Fnum++;//统计个数加一
    }
    //放入提取到的数字个数
    num[0] = Fnum;
}

string getStringAfterChar(string str, char c) {
    int pos = str.find(c); // find the position of the character in the string
    if (pos == string::npos) { // if the character is not found
        return "";
    } else {
        return str.substr(pos+1); // return the substring after the character
    }
}

string getStringAfterString(string str, string s) {
    int pos = str.find(s); // find the position of the string in the string
    if (pos == string::npos) { // if the string is not found
        return "";
    } else {
        return str.substr(pos+s.length()); // return the substring after the string
    }
}

string findSubstring(string str, string str1, string str2) {
    size_t start = str.find(str1) + str1.length(); // 查找第一个字符串在str中的起始位置
    size_t end = str.find(str2, start); // 在start位置后查找第二个字符串在str中的位置
    if (end == string::npos) { // 如果找不到第二个字符串，则返回空字符串
        return "";
    }
    return str.substr(start, end - start); // 返回在第一个字符串和第二个字符串之间的子字符串
}